
前提：
1、配置各php支持使用memcache；
2、安装配置好memcached服务器，这里假设其地址为172.16.200.11，端口为11211；


一、配置php将会话保存至memcached中

编辑php.ini文件，确保如下两个参数的值分别如下所示：
session.save_handler = memcache
session.save_path = "tcp://172.16.200.11:11211?persistent=1&weight=1&timeout=1&retry_interval=15"

二、测试

新建php页面setsess.php，为客户端设置启用session：
<?php
session_start();
if (!isset($_SESSION['www.MageEdu.com'])) {
  $_SESSION['www.MageEdu.com'] = time();
}
print $_SESSION['www.MageEdu.com'];
print "<br><br>";
print "Session ID: " . session_id();
?>

新建php页面showsess.php，获取当前用户的会话ID：
<?php
session_start();
$memcache_obj = new Memcache;
$memcache_obj->connect('172.16.200.11', 11211);
$mysess=session_id();
var_dump($memcache_obj->get($mysess));
$memcache_obj->close();
?>








<?php 
// Generating cookies must take place before any HTML. 
// Check for existing "SessionId" cookie 
$session = $HTTP_COOKIE_VARS["SessionId"]; 
if ( $session == "" ) { 
// Generate time-based unique id. 
// Use user's IP address to make more unique. 
$session = uniqid ( getenv ( "REMOTE_ADDR" ) ); 
// Send session id - expires when browser exits 
SetCookie ( "SessionId", $session ); 
} 
?> 
<HTML> 
<HEAD><TITLE>Session Test</TITLE></HEAD> 
<BODY> <br> 16 Current session id: <?php echo $session ?> 
</BODY></HTML>




yum -y install memcached libevent
service memcached start


session.save_handler = memcache
session.save_path = "tcp://172.18.21.60:11211?persistent=1&weight=1&timeout=1&retry_interval=15"


-----------------------------------------------------------------------------------
#! /bin/sh
#
# chkconfig: - 55 45
# description:  The memcached daemon is a network memory cache service.
# processname: memcached
# config: /etc/sysconfig/memcached
# pidfile: /var/run/memcached/memcached.pid

# Standard LSB functions
#. /lib/lsb/init-functions

# Source function library.
. /etc/init.d/functions

PORT=11211
USER=memcached
MAXCONN=1024
CACHESIZE=64
OPTIONS=""

if [ -f /etc/sysconfig/memcached ];then 
    . /etc/sysconfig/memcached
fi

# Check that networking is up.
. /etc/sysconfig/network

if [ "$NETWORKING" = "no" ]
then
    exit 0
fi

RETVAL=0
prog="memcached"
pidfile=${PIDFILE-/var/run/memcached/memcached.pid}
lockfile=${LOCKFILE-/var/lock/subsys/memcached}

start () {
    echo -n $"Starting $prog: "
    # Ensure that /var/run/memcached has proper permissions
    if [ "`stat -c %U /var/run/memcached`" != "$USER" ]; then
        chown $USER /var/run/memcached
    fi

    daemon --pidfile ${pidfile} memcached -d -p $PORT -u $USER  -m $CACHESIZE -c $MAXCONN -P ${pidfile} $OPTIONS
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch ${lockfile}
}
stop () {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} /usr/bin/memcached
    RETVAL=$?
    echo
    if [ $RETVAL -eq 0 ] ; then
        rm -f ${lockfile} ${pidfile}
    fi
}

restart () {
        stop
        start
}


# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status -p ${pidfile} memcached
    RETVAL=$?
    ;;
  restart|reload|force-reload)
    restart
    ;;
  condrestart|try-restart)
    [ -f ${lockfile} ] && restart || :
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart}"
    RETVAL=2
        ;;
esac

exit $RETVAL
-----------------------------------------------------------------------------------


































memcached：
    
    数据结构模型：
        结构化数据：关系型数据库；
        半结构化数据：xml, json, ... （NoSQL）；
        非结构化数据：文件系统； 
        
    k/v：
        memcached：存储于内存中；
        redis：存储于内存中，周期性地将数据同于辅存上；
        
    memcached：
        LiveJournal旗下的Danga Interactive
        
        特性：
            k/v缓存：可序列化数据；存储项：key, value, flag, expire time；
            功能的实现一半依赖于服务端，一半依赖客户端；
            分布式缓存：互不通信的分布式集群；
            O(1)的执行效率；
            清理过期数据：LRU 
                缓存项过期
                缓存空间用尽
            
        缓存系统的种类：
            代理式缓存；
            旁路式缓存；
            
        分布式系统主机路由：
            取模法
            一致性hash；
            
        memcached：
            11211/tcp, 11211/udp
            
            主程序：memcached
            环境配置文件：/etc/sysconfig/memcached
            
            协议格式
                文本协议
                二进制协议   
                
            命令：
                统计类：stats，stats items, stats slabs, stats sizes
                存储类：set, add, replace, append, prepend
                获取数据类：get, delete, incr/decr
                清空：flush_all
                
            memcached程序的常用选项：
                -l <ip_addr>： 监听的地址；
                -m <num>：缓存空间大小，单位为MB；默认为64；
                -c <num>：最大并发连接数，默认为1024；
                -p <num>：Listen on TCP port <num>, the default is port 11211.
                -U <num>：Listen on UDP port <num>, the default is port 11211, 0 is off.
                -M：缓存空间耗尽时，向请求者返回错误信息，而不是基于LRU算法进行缓存清理；
                -f <factor>：growth factor，增长因子；
                -t <threads>：处理用于请求的线程数；
                
            memcached默认没有认证机制，但可借助于SASL进行认证；
            
            php连接memcached服务的模块：
                memcache：php-pecl-memcache
                memcached：php-pecl-memcached
                    
            可提供工具程序的程序包：libmemcached；
            
    LB Cluster保持会话的方法：
        session sticky
        session cluster 
        session server 
        
    博客作业：
        nginx负载均衡用户请求至后端多个ammp主机，php的会话保存于memcached中；
        
    